<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // var target = {
    //   a: 1,
    //   b: 2
    // };
    // let proxy = new Proxy(target, {
    //   get(target, prop) {
    //     console.log(prop)
    //     return target[prop]
    //   },
    //   set(target, prop, value) {
    //     console.log(prop)
    //     target[prop] = value;
    //   },
    //   // 判断对象是否存在某个属性时会触发
    //   has(target, prop) {
    //     console.log(prop)
    //   },
    //   // 删除某个属性时会触发
    //   deleteProperty(target, prop) {
    //     console.log('delete');
    //     delete target[prop]
    //   }
    // });
    // console.log('a' in proxy)
    // console.log(proxy.hasOwnProperty('a'))
    // for (let i in proxy) { 
    //   console.log(proxy[i])
    // }
    // delete proxy.a;
    // console.log(proxy.a)
    // console.log(target.a)
    // target.c = 2222;
    // proxy.d = 3333;
    // // 在target或proxy上修改参数，两个都会改变，target修改时，不会触发get，set
    // console.log(proxy)
    // console.log(target)



    // var target = {
    //   a: 1,
    //   b: 2
    // };
    // let proxy = new MyProxy(target, {
    //   get(target, prop) {
    //     console.log(prop)
    //     return target[prop]
    //   },
    //   set(target, prop, value) {
    //     console.log(prop)
    //     target[prop] = value;
    //   }
    // });
    // function MyProxy(target, handle) {
    //   let _target = deepClone(target)
    //   Object.keys(_target).forEach((key) => {
    //     Object.defineProperty(_target, key, {
    //       get() {
    //         return handle.get && handle.get(target, key)
    //       },
    //       set(newVal) {
    //         handle.set && handle.set(target, key, newVal)
    //       }
    //     })
    //   })
    //   return _target
    // }
    // function deepClone(origin, target) {
    //   let obj = target || {};
    //   const toSting = Object.prototype.toString;
    //   const str = '[object Array]';
    //   for (let key in origin) {
    //     if (origin.hasOwnProperty(key)) {
    //       if (origin[key] !== null && typeof (origin[key]) === 'object') {
    //         obj[key] = toSting.apply(origin[key]) === str ? [] : {}
    //       } else {
    //         obj[key] = origin[key]
    //       }
    //     }
    //   }
    //   return obj
    // }

    // proxy中get和set若未定义。按默认处理
    // const obj = { a: 123, b: 333 };
    // const proxy = new Proxy(obj, {
    //   // get: function (target, key) {
    //   //   return target[key]
    //   // },
    //   set: function (target, key, value) {
    //     target[key] = value;
    //   }
    // })
    // console.log(proxy.a);
    // proxy.a = 1000;
    // console.log(proxy.a);


    // 必须要有get和set来传到val
    // const obj = { a: 123, b: 333 };
    // let val = 123;
    // Object.defineProperty(obj, 'a', {
    //   // get: function () {
    //   //   return val
    //   // },
    //   set: function (value) {
    //     val = value;
    //   }
    // })
    // console.log(obj.a);
    // obj.a = 1000;
    // console.log(obj.a);

    const obj = {
      a: 123,
      get getA() {
        return this.a
      },
      set setA(val) {
        this.a = val;
      }
    };
    console.log(obj)
    // console.log(obj.getA)
    // obj.a = 23213
    // console.log(obj.getA)
    for (let i in obj) {
      console.log(i)
    }
  </script>

</body>

</html>